package com.yc.动态代理.JDK动态代理;

import com.yc.动态代理.静态代理.抽象主题;
import com.yc.动态代理.静态代理.真实主题;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDK动态代理 {
    private 抽象主题 target;
    private 抽象主题 proxy(抽象主题 target){
        this.target = target;
        // JDK : Proxy  InvocationHandler
        // 返回被代理对象
        return (抽象主题) Proxy.newProxyInstance(
                target.getClass().getClassLoader(), //类加载器
                target.getClass().getInterfaces(),  //获取对象实现的所有接口
                new InvocationHandler() {      //JS 回调函数
                    @Override
                    public Object invoke(Object proxy,  // 代理对象
                                         Method method, // 执行的方法
                                         Object[] args  // 方法参数数组
                        ) throws Throwable {  // 业务方法可能抛出的异常
                        System.out.println("前置增强:xxxx");
                        // 通过反射调用目标方法  ==> 环绕增强
                        Object ret = method.invoke(target, args);
                        System.out.println("前置增强:yyyy");
                        return ret;  // 业务方法的返回值, void 返回 null
                    }
                }
        );
    }

    public static void main(String[] args) {
        抽象主题 a = new 真实主题();
        JDK动态代理 b = new JDK动态代理();
        抽象主题 proxy = b.proxy(a);
        proxy.sayHello();
    }

}
